<?php

namespace App\Http\Controllers\Admin;

use App\Models\Fang;
use App\Models\Fangattr;
use App\Models\FangOwner;
use App\Models\City;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\FangRequest;
// 发起http请求
use GuzzleHttp\Client;
// 导入es生成索引库
use Elasticsearch\ClientBuilder;

class FangController extends BaseController
{
    /**
     * 房源列表
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        // 获取搜索框 
        // 最低价格
        $min = $request->get('min');
        // 最高价格
        $max = $request->get('max');
        // 搜索关键字
        $kw = $request->get('kw', '');
        // 查询对象
        $query = Fang::with(['owner']);
        // 日期
        if (!empty($min) && !empty($max)){
            $query->whereBetween('fang_rent',[$min,$max]);
        }
        // 搜索关键词
        if(!empty($kw)){
            $attr = Fangattr::where('name', 'like', "%{$kw}%")->get('id')->toArray();
            $attr = count($attr) ? $attr[0]['id'] : null;
            $owner = FangOwner::where('name', 'like', "%{$kw}%")->get('id')->toArray();
            $owner = count($owner) ? $owner[0]['id'] : null;
            $query->where('fang_name', 'like', "%{$kw}%");
            $query->orWhere('fang_xiaoqu', 'like', "%{$kw}%");
            $query->orWhere('fang_area', 'like', "%{$kw}%");
            if($attr){
                $query->orWhere('fang_rent_type', 'like', "%{$attr}%");
                $query->orWhere('fang_direction', 'like', "%{$attr}%");
            }
            if($owner){
                $query->orWhere('fang_owner', 'like', "%{$owner}%");
            }
        }
        // 分页 搜索
        $data = $query->paginate($this->pagesize);
        if(count($data->toArray()['data'])){
            // 租凭方式 与 朝向
            foreach($data as $item){
                $arr[] = $item->fang_rent_class;
                $arr[] = $item->fang_direction;
            }
            $arr = array_unique($arr);
            foreach($arr as $key){
                $tmp = Fangattr::where('id',$key)->get(['name'])->toArray();
                $val[$key] = $tmp[0]['name'];
            }
            // 业主信息
            $arr = $tmp = null;
            foreach($data as $item){
                $arr[] = $item->fang_owner;
            }
            $arr = array_unique($arr);
            foreach($arr as $key){
                $tmp = FangOwner::where('id',$key)->get(['name'])->toArray();
                $value[$key] = $tmp[0]['name'];
            }
            foreach($data as $item){
                $item->fang_rent_class = $val[$item->fang_rent_class];
                $item->fang_owner = $value[$item->fang_owner];
                $item->fang_direction = $val[$item->fang_direction];
            }
        }
        return view('admin.fang.index', compact('data'));
    }

    /**
     * 添加显示模板
     * 依赖注入
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Fang $fang)
    {
        // 取关联表数据 方案一
        // $data = (new Fang())->relationData();
        // 方案二
        $data = $fang->relationData();
        return view('admin.fang.create',$data);
    }
    // 获取城市
    public function city(Request $request){
        $data = City::where('pid',$request->get('id'))->withTrashed()->get(['id','name']);
        if(!count($data)){
            $data = City::where('id',$request->get('id'))->withTrashed()->get(['id','name']);
        }
        return $data;
    }
     // 文件上传
     public function upfile(Request $request){
        // 默认图标
        $pic = config('up.pic');
        if($request->hasFile('file')){
            // 上传
            // 参数2 配置的节点名称
            $ret = $request->file('file')->store('','fang');
            $pic = '/uploads/fang/'.$ret;
        }
        return ['status' => 0,'url' => $pic];
    }
    // 文件删除
    public function delfile(Request $request){
        $filepath = $request->get('file');
        // 得到真实的地址
        $path = public_path().$filepath;
        // 删除指定文件
        unlink($path);
        return ['status'=>0,'msg'=>'success'];
    }

    /**
     * 添加处理
     */
    public function store(FangRequest $request)
    {
        // 表单数据
        $dopost = $request->except(['_token','file']);
        // 入库
        $model = Fang::create($dopost);
        // 添加数据入库成功了
        // 发起http请求
        // 声明一个请求类，并指定请求过期时间
        $client = new Client(['timeout' => 5]);
        // 得到请求地址
        $url = config('gaode.geocode');
        $url = sprintf($url,$model->fang_addr,$model->fang_city);
        // 发起请求
        $response = $client->get($url);
        $body = (string)$response->getBody();
        $arr = json_decode($body,true);
        // 如果找到了对应经纬度，存入数据表
        if(count($arr['geocodes']) > 0){
            $localtionArr = explode(',',$arr['geocodes'][0]['location']);
            $model->update([
                'longitude' => $localtionArr[0],
                'latitude' => $localtionArr[1]
            ]);
        }
        // es数据的添加
        // 得到es客户端对象
        // $client = ClientBuilder::create()->setHosts(config('es.host'))->build();
        // // 写文档
        // $params = [
        //     'index' => 'fang',
        //     'type' => '_doc',
        //     'id' => $model->id,
        //     'body' => [
        //         'fang_name' => $model->fang_name,
        //         'fang_desn' => $model->fang_desn,
        //     ],
        // ];
        // // 添加数据到索引文档中
        // $client -> index($params);
        // 跳转
        return redirect(route('admin.fang.index'));
    }

    // 生成房源信息索引
    public function esinit(){
        // 得到es客户端对象
        $client = ClientBuilder::create()->setHosts(config('es.host'))->build();
        // 创建索引
        $params = [
            // 生成索引的名称
            'index' => 'fang',
            // 类似 body
            'body' => [
                'settings' => [
                    // 分区数
                    'number_of_shards' => 5,
                    // 副本数
                    'number_of_replicas' => 1,
                ],
                'mappings' => [
                    '_doc' => [
                        '_source' => [
                            'enabled' => true
                        ],
                        // 字段 类似表字段，设置类型
                        'properties' => [
                            'fang_name' => [
                                // 相当于数据查询是的 = 张三你好，必须找到张三你好
                                'type' => 'keyword' 
                            ],
                            'fang_desn' => [
                                'type' => 'text',
                                // 中文分词 张三你好 张三 你好 张三你好
                                'analyzer' => 'ik_max_word',
                                'search_analyzer' => 'ik_max_word'
                            ]
                        ]
                    ]
                ]
            ],
        ];
        // 创建索引
        $response = $client->indices()->create($params);
        dump($response);
    }

    // 改变房源状态
    public function changestatus(Request $request){
        // 房源ID号
        $id = $request->get('id');
        // 房源状态
        $status = $request->get('status');
        // 根据id修改房源状态
        Fang::where('id',$id)->update(['fang_status' => $status]);
        return 'success';
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Fang  $fang
     * @return \Illuminate\Http\Response
     */
    public function show(Fang $fang)
    {
        //
    }

    /**
     * 修改房源
     *
     * @param  \App\Models\Fang  $fang
     * @return \Illuminate\Http\Response
     */
    public function edit(Fang $fang)
    {
        $attr = $fang->relationData();
        $fang = $fang->toArray();
        $city_select = City::where('pid',$fang['fang_province'])->withTrashed()->get(['id','name'])->toArray();
        $region_select = City::where('pid',$fang['fang_city'])->withTrashed()->get(['id','name'])->toArray();
        $town_select = City::where('pid',$fang['fang_region'])->withTrashed()->get(['id','name'])->toArray();
        $city = $city_select ? $city_select : $attr['cityData']->toArray();
        $region = $region_select ? $region_select : $city;
        $town = $town_select ? $town_select : $region;
        return view('admin.fang.edit',array_merge($attr,$fang,compact('city','region','town')));
    }

    /**
     * 修改房源入库
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Fang  $fang
     * @return \Illuminate\Http\Response
     */
    public function update(FangRequest $request, Fang $fang)
    {
        // 表单数据
        $postData = $request->except(['method','_token','file']);
        // 入库
        $fang->update($postData);
        // 添加数据入库成功了
        // 发起http请求
        // 声明一个请求类，并指定请求过期时间
        $client = new Client(['timeout' => 5]);
        // 得到请求地址
        $url = config('gaode.geocode');
        $url = sprintf($url,$fang->fang_addr,$fang->fang_city);
        // 发起请求
        $response = $client->get($url);
        $body = (string)$response->getBody();
        $arr = json_decode($body,true);
        // 如果找到了对应经纬度，存入数据表
        if(count($arr['geocodes']) > 0){
            $localtionArr = explode(',',$arr['geocodes'][0]['location']);
            $fang->update([
                'longitude' => $localtionArr[0],
                'latitude' => $localtionArr[1]
            ]);
        }
        // es数据的修改
        // 得到es客户端对象
        // $client = ClientBuilder::create()->setHosts(config('es.host'))->build();
        // // 写文档
        // $params = [
        //     'index' => 'fang',
        //     'type' => '_doc',
        //     'id' => $fang->id,
        //     'body' => [
        //         'fang_name' => $fang->fang_name,
        //         'fang_desn' => $fang->fang_desn,
        //     ],
        // ];
        // // 添加数据到索引文档中
        // $client -> index($params);
        // 跳转
        return redirect(route('admin.fang.index'));
    }

    /**
     * 删除操作
     *
     * @param  \App\Models\Fang  $fang
     * @return \Illuminate\Http\Response
     */
    public function destroy(Fang $fang)
    {
        $fang->delete();
        return ['status' => 0,'msg' => '删除成功'];
    }
    // 批量删除
    public function delall(Request $request)
    {
        $ids = $request->get('id');
        Fang::destroy($ids);
        return ['status' => 0, 'msg' => '批量删除成功'];
    }
}
